#include "music.h"
#include<QMediaPlayer>
#include<QCoreApplication>
#include<QSqlQuery>
#include<QDebug>
#include<QSqlError>

//描述音乐对象的类
Music::Music():IsLike(false),IsHistory(false)
{
        this->musicId=QUuid::createUuid().toString();
}

Music::Music(const QUrl& Url):IsLike(false),IsHistory(false),musicUrl(Url)
{
    //给每个音乐创建唯一的标识符uuid
    this->musicId=QUuid::createUuid().toString();
    //根据Url对音乐文件进行解析,形成元数据(媒体的作者,媒体的时长..等描述文件信息的数据）
    phraseMediaData();
}


void Music::setMusicName(const QString &musicName){ this->musicName=musicName;}

void Music::setMusicSinger(const QString &musicSinger){this->musicSinger=musicSinger;}

void Music::setMusicAlumn(const QString &musicAlumn){ this->musicAlumn=musicAlumn;}

void Music::setMusicTime(qint64 musicTime){this->musicTime=musicTime;}

void Music::setIsLike(bool IsLike){this->IsLike=IsLike;}

void Music::setIsHistory(bool IsHistory){this->IsHistory=IsHistory;}

void Music::setMusicUrl(const QUrl &musicUrl){ this->musicUrl=musicUrl;}

void Music::setMusicId(const QString &musicId)
{
    this->musicId=musicId;
}

void Music::insertToDB(QSqlDatabase db)
{
    //将音乐的信息插入数据库
    QSqlQuery query(db);

    //先查询这条数据是否在数据库中存在
    query.prepare("select EXISTS (select 1 FROM MusicInfo where musicId=?)");
    query.addBindValue(musicId);
    if(!query.exec())
    {
        qDebug()<<"数据库查询失败"<<query.lastError();
        return;

    }
    else
    {
        //判断查询结果是否有值
        if(query.next())
        {
        bool res=query.value(0).toBool();
        if(res)
        {
            //说明该首音乐信息已经存在
            query.prepare("UPDATE MusicInfo SET IsLike=?,IsHistory=? where musicId=?");
            query.addBindValue(IsLike?1:0);
            query.addBindValue(IsHistory?1:0);
            query.addBindValue(musicId);
            if(!query.exec())
            {
                qDebug()<<"UPDATE  error";
                return;
            }
             qDebug()<<"UPDATE SUCCESS DB success"<<":  "<<musicName;

        }
        else
        {
            query.prepare("INSERT INTO MusicInfo(musicName,musicSinger,musicAlumn,musicTime,IsLike,IsHistory,musicUrl,musicId)\
                           VALUES(?,?,?,?,?,?,?,?)");
            query.bindValue(0,musicName);
            query.bindValue(1,musicSinger);
            query.bindValue(2,musicAlumn);
            query.bindValue(3,musicTime);
            query.bindValue(4,IsLike?1:0);
            query.bindValue(5,IsHistory?1:0);
            query.bindValue(6,musicUrl.toLocalFile());
            query.bindValue(7,musicId);
            if(!query.exec())
            {
                qDebug()<<"Insert into DB error";
                return;
            }
             qDebug()<<"Insert into DB success"<<": "<<musicName;
            }
        }
    }


}


QString Music::getMusicId(){return musicId;};



QString Music::getMusicName(){ return this->musicName; }

QUrl Music::getMusicUrl(){ return this->musicUrl;}
QString Music::getMusicSinger(){ return this->musicSinger;}
QString Music::getMusicAlumn(){return this->musicAlumn;}
qint64 Music::getMusicTime(){ return this->musicTime;}
bool Music::getIsLike(){return this->IsLike;}
bool Music::getIsHistory(){return this->IsHistory;}

void Music::phraseMediaData()
{
    //解析元数据步骤
    //1:创建QMediaPlayer对象
    QMediaPlayer player;
    //2:设置媒体源,但是该方法不会等待媒体源的加载,会立刻返回
    player.setMedia(musicUrl);
    //3.因为要对媒体源加载成功,才能正确读取媒体源的正确元数据,等待媒体源数据加载成功
    //isMetaDataAvailable是由QmediaPlayer的基类QMediaObject提供的,判断媒体源是否加载成功
    while(!player.isMetaDataAvailable())
    {
        //等待媒体源加载成功
        //循环等待时：主界⾯消息循环就⽆法处理了，因此需要在等待解析期间，让消息循环继续处理
        QCoreApplication::processEvents();

    }

    //获取媒体的元数据
    // 返回要获取的媒体数据key的值
    //QVariant QMediaObject::metaData(const QString &key) const
    if(player.isMetaDataAvailable())
    {
        musicName= player.metaData("Title").toString();
        musicSinger= player.metaData("Author").toString();
        musicAlumn= player.metaData("AlbumTitle").toString();
        musicTime=player.metaData("Duration").toLongLong();

        //可能会出现元数据为空的情况,因为音乐文件的格式可能不一样,有可能歌手名就在文件名上
        //先拿到每个文件的路径
        QString filename=musicUrl.fileName();
        int index=filename.indexOf('-');
        if(musicName.isEmpty()) //可能在歌名中
        {
            //2002年的第一场雪 - 刀郎
            if(index!=-1)
            {
                musicName=filename.mid(0,index);
            }
            else
            {
                //Andy阿杜.mp3
                musicName=filename.mid(0,filename.indexOf('.')).trimmed();
            }

        }
        if(musicSinger.isEmpty())
        {
            if(index!=-1)
            {
                //逆战- 张杰.mp3
                musicSinger=filename.mid(index+1,filename.indexOf('.')-index-1).trimmed();
            }
            else
            {
                musicSinger="未知";
            }
        }
        if(musicAlumn.isEmpty())
        {
            musicAlumn="未知";
        }

    }
}

QString Music::getLrcFilePath()
{
    QString filepath = musicUrl.toLocalFile();
    filepath.replace(".mp3",".lrc");
    filepath.replace(".flac",".lrc");
    filepath.replace(".mpga",".lrc");

    return filepath;

}


